package com.zjsru.plan2023.oneday;

/**
 * @Author: CookLee
 * @Date: 2023/8/8
 * 任意子数组和的绝对值的最大值
 * \
 *  输入：nums = [1,-3,2,3,-4]
 * 输出：5
 * 解释：子数组 [2,3] 和的绝对值最大，为 abs(2+3) = abs(5) = 5 。
 * \
 * 输入：nums = [2,-5,1,-4,3,-2]
 * 输出：8
 * 解释：子数组 [-5,1,-4] 和的绝对值最大，为 abs(-5+1-4) = abs(-8) = 8 。
 */
public class MaxAbsoluteSum {
    
    public int maxAbsoluteSum(int[] nums) {
        //正数，负数各定义2个变量，一个总和 一个子数组相加时的最大值/最小值
        int positiveMax = 0, positiveSum = 0;
        int negativeMin = 0, negativeSum = 0;
        //子数组内要求是连续的数
        for (int num : nums) {
            //最大值比总和大说明在之前的某段数组和大于现有数组和
            positiveSum += num;
            positiveMax = Math.max(positiveMax, positiveSum);
            //如果小于0 说明加入的负数比较大，当前的子数组不符合要求
            positiveSum = Math.max(0, positiveSum);
            
            negativeSum += num;
            negativeMin = Math.min(negativeMin, negativeSum);
            negativeSum = Math.min(0, negativeSum);
        }
        return Math.max(positiveMax, Math.abs(negativeMin));
    }
    
    public static void main(String[] args) {
        MaxAbsoluteSum maxAbsoluteSum = new MaxAbsoluteSum();
        int[] nums = new int[]{1,-3,2,3,-4};
        System.out.println(maxAbsoluteSum.maxAbsoluteSum(nums));
    }
}
